
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.mystd.all;

entity regBlock is 
    port (
    	clk				: in std_logic;		-- signal takta
    	reset			: in std_logic;		-- RESET signal
        
    	regsel1			: in std_logic;		-- upravljacki signal kojima se propusta odgovarajuci registar
        									-- na magistralu M1
    	regsel1Value 	: in bus5;			-- vrednost kojima se odredjuje koji registar se propusta na
    										-- na magistralu M1
    	regsel2			: in std_logic;		-- upravljacki signal kojima se propusta odgovarajuci registar
        									-- na magistralu M2
    	regsel2Value 	: in bus5;			-- vrednost kojima se odredjuje koji registar se propusta na
    										-- na magistralu M2
    											
    	regsel3			: in std_logic;		-- upravljacki signal kojima se propusta odgovarajuci registar
        									-- na magistralu M3
    	regsel3Value 	: in bus5;			-- vrednost kojima se odredjuje koji registar se propusta na
    										-- na magistralu M3	ili kada se vrsi upis (kada je regIN == '1')																		
    	
    	regIN			: in std_logic;		-- signal kojim se odgovarajuci registar 										    										
        									-- (tj. registar ciji indeks se nalazi na linijama regsel1Value)
    										
    	M1Bus			: out bus32;		-- interna magistrala M1
    	M2Bus			: out bus32;		-- interna magistrala M2
    	M3Bus			: inout bus32;		-- interna magistrala M3
    	
    	reg2M3			: in std_logic		-- signal kojim se vrednost RS2 operanda
											-- propusta na magistralu M3Bus								
	); 
     
end regBlock;     
        

architecture regBlock of regBlock is
	-- niz od 32 registra
	signal registers : registerArray;

begin  

	process
	begin
    	
		wait until clk = '1';
		        
		if(reset = '1') then
			-- najvisi prioritet ima reset
			-- inicijalizujemo sadrzaje registara nulama
			for i in 0 to 31 loop
				registers(i) <= X"00000000";
			end loop;
			
		else
			-- provera da li je neki od upravljackih linija aktivno			 
			if(regIN = '1') then
				-- ako je aktivan signal regIN upisujemo sadrzaj interne magistrale M3
				-- u u RD oprerand (registar ciji indeks se nalazi u regsel3Value)
				registers(to_integer(unsigned(regsel3Value))) <= M3Bus;
			end if;	 
		end if;			-- kraj if(reset = '1')
           	
	end process;  
	
	
	-- propustamo vrednost prvog operanda na M1Bus
	M1Bus <= registers(to_integer(unsigned(regsel1Value))) when regsel1 = '1'
			else (others => 'Z');
	-- propustamo vrednost drugog operanda na M2Bus
	M2Bus <= registers(to_integer(unsigned(regsel2Value))) when regsel2 = '1'
			else (others => 'Z');
	-- propustamo RD operand na magistralu M3Bus
	-- kod instrukcije JSR potreban nam je operand RS2
	M3Bus <= registers(to_integer(unsigned(regsel3Value))) when regsel3 = '1' else
			 registers(to_integer(unsigned(regsel2Value))) when reg2M3 = '1' else
			(others => 'Z') ;--
	
end regBlock;








